package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.dominio.common.helper.SelectOneMenuHelper;
import pe.com.cotelasa.scp.controlador.backingBean.BKCuentaBancaria;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.ComandoVer;
import pe.com.cotelasa.scp.dominio.modelo.CuentaBancariaModel;
import pe.com.cotelasa.scp.dominio.service.IServicioBanco;
import pe.com.cotelasa.scp.dominio.service.IServicioCuentaBancaria;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.entidad.Banco;
import pe.com.cotelasa.scp.entidad.CuentaBancaria;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBCuentaBancaria")
//@Scope("prototype")
@Scope("request")
public class MBCuentaBancaria extends MBGenerico implements IMantenedor, Serializable {

    private static final long serialVersionUID = -3008828663507135743L;
    private static Logger logger = Logger.getLogger(MBCuentaBancaria.class);
    @Inject
    private BKCuentaBancaria bkCuentaBancaria;
    @Inject
    private IServicioBanco servicioBanco;
    @Inject
    private IServicioCuentaBancaria servicioCuentaBancaria;
    @Inject
    private IServicioTipoMoneda servicioTipoMoneda;
    @Autowired
    private BKSession session;
    @Autowired
    private CuentaBancariaModel cuentaBancariaModel;

    public MBCuentaBancaria() {
    }

    /**
     * Metodo que inicializa el mantenimiento Cuenta Bancaria
     *
     * @return path del formulario consulta.
     */
    public String mostrarMantenimiento() {
        limpiarBusqueda();
        cargarCombo();
        return URLPaginacion.CuentaBancaria.URL_LISTA_CUENTA_BANCARIA;
    }

    public void buscar() {
//        CuentaBancaria objCuentaBancaria = new CuentaBancaria();
//        objCuentaBancaria.setNumeroCuenta(bkCuentaBancaria.getCuentaBancariaBusqueda().getNumeroCuenta());


        try {
//            objCuentaBancaria.setIdBanco(servicioBanco.conseguirBancoPorId(bkCuentaBancaria.getIdBancoBusqueda()));
//            objCuentaBancaria.setIdEmpresa(session.getEmpresa());
//            objCuentaBancaria.setIdTipoMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bkCuentaBancaria.getIdTipoMonedaBusqueda()));
//            bkCuentaBancaria.setListaCuentaBancariasActivas(this.servicioCuentaBancaria.listarCuentaBancariasPorFiltro(objCuentaBancaria));
//        	bkCuentaBancaria.getCuentaBancariaBusqueda().setIdEmpresa(session.getEmpresa());

            CuentaBancaria ctaBancaria = bkCuentaBancaria.getCuentaBancariaBusqueda();

            System.out.println("Banco:" + bkCuentaBancaria.getCuentaBancariaBusqueda().getIdBanco().getId());
            System.out.println("Num cta:" + bkCuentaBancaria.getCuentaBancariaBusqueda().getNumeroCuenta());
            System.out.println("Tipo de moneda" + bkCuentaBancaria.getCuentaBancariaBusqueda().getIdTipoMoneda().getId());
            ctaBancaria.setIdEmpresa(session.getEmpresa());

            bkCuentaBancaria.setListaCuentaBancariaLista(cuentaBancariaModel.obtenerListaCuentaBancaria(bkCuentaBancaria.getCuentaBancariaBusqueda()));
            //bkCuentaBancaria.setListaCuentaBancariasActivas(servicioCuentaBancaria.listarCuentaBancariasPorFiltro(bkCuentaBancaria.getCuentaBancariaBusqueda()));

        } catch (ModelExcepcion e) {
            logger.error("ERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROR");
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
            logger.error(e.getMessage(), e);
            cuentaBancariaModel.enviarCorreoError(e, e.getMessage());
        }



    }

    public String nuevo() {
        bkCuentaBancaria.setComando(new ComandoGuardar(this));
        cargarCombo();
        /*bkCuentaBancaria.setIdTipoMonedaFormulario(0);
        bkCuentaBancaria.setIdBancoFormulario(0);*/
        bkCuentaBancaria.setCuentaBancariaFormulario(new CuentaBancaria());
        bkCuentaBancaria.getCuentaBancariaFormulario().setIdBanco(new Banco());
        bkCuentaBancaria.getCuentaBancariaFormulario().setIdTipoMoneda(new TipoMoneda());

        return URLPaginacion.CuentaBancaria.URL_FORMULARIO_CUENTA_BANCARIA;
    }

    public String editar() {
        bkCuentaBancaria.setComando(new ComandoActualizar(this));
        cargarComboActualizar();
        //bkCuentaBancaria.setIdBancoFormulario(bkCuentaBancaria.getCuentaBancariaFormulario().getIdBanco().getId());
        //bkCuentaBancaria.setIdTipoMonedaFormulario(bkCuentaBancaria.getCuentaBancariaFormulario().getIdTipoMoneda().getId());
        //limpiarBusqueda();
        return URLPaginacion.CuentaBancaria.URL_FORMULARIO_CUENTA_BANCARIA;
    }

    public String ver() {
        bkCuentaBancaria.setComando(new ComandoVer(this));
        //limpiarBusqueda();

        CuentaBancaria cta = new CuentaBancaria();
        try {
            cta = servicioCuentaBancaria.conseguirCuentaBancariaPorId(bkCuentaBancaria.getCuentaBancariaFormulario().getId());

            System.out.println("num cuenta: " + cta.getNumeroCuenta());
            System.out.println("num cuenta: " + cta.getNumeroCuenta());

            bkCuentaBancaria.setCuentaBancariaFormulario(new CuentaBancaria());
            bkCuentaBancaria.setCuentaBancariaFormulario(cta);
        } catch (ServiceException e) {

            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }


        return URLPaginacion.CuentaBancaria.URL_VER_CUENTA_BANCARIA;
    }

    public String guardar() {
        CuentaBancaria cuentaBancaria = bkCuentaBancaria.getCuentaBancariaFormulario();
        cuentaBancaria.setUsrCreacion(session.getUsuario().getUsuario());
        cuentaBancaria.setFecCreacion(new Date());
        try {
            //cuentaBancaria.setIdBanco(servicioBanco.conseguirBancoPorId(bkCuentaBancaria.getIdBancoFormulario()));
            //cuentaBancaria.setIdTipoMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bkCuentaBancaria.getIdTipoMonedaFormulario()));
            cuentaBancaria.setMontoActual(cuentaBancaria.getMontoApertura());
            cuentaBancaria.setIdEmpresa(session.getEmpresa());
            servicioCuentaBancaria.guardarCuentaBancaria(cuentaBancaria);
            buscar();
            cargarCombo();
            //mostrarMantenimiento();
            mostrarMensaje("Se guardo la cuenta bancaria satisfactoriamente.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.CuentaBancaria.URL_LISTA_CUENTA_BANCARIA;
    }

    public String actualizar() {
        CuentaBancaria cuentaBancaria = bkCuentaBancaria.getCuentaBancariaFormulario();
        cuentaBancaria.setUsrModificacion(session.getUsuario().getUsuario());
        cuentaBancaria.setFecModificacion(new Date());
        try {
            cuentaBancaria.setIdBanco(servicioBanco.conseguirBancoPorId(cuentaBancaria.getIdBanco().getId()));
            //cuentaBancaria.setIdTipoMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bkCuentaBancaria.getIdTipoMonedaFormulario()));
            //bkCuentaBancaria.setListaCuentaBancariasActivas(servicioCuentaBancaria.listarCuentaBancariasActivas());
            cuentaBancaria.setIdTipoMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(cuentaBancaria.getIdTipoMoneda().getId()));
            servicioCuentaBancaria.actualizarCuentaBancaria(cuentaBancaria);
            buscar();
            //cargarCombo();
            mostrarMensaje("Se actualizó los datos de la cuenta bancaria satisfactoriamente.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la información. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.CuentaBancaria.URL_LISTA_CUENTA_BANCARIA;
    }

    public void eliminar(ActionEvent actionEvent) {
        CuentaBancaria cuentaBancaria = bkCuentaBancaria.getCuentaBancariaSeleccionado();
        cuentaBancaria.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        cuentaBancaria.setUsrModificacion(session.getUsuario().getUsuario());
        cuentaBancaria.setFecModificacion(new Date());
        try {
            servicioCuentaBancaria.actualizarCuentaBancaria(cuentaBancaria);
            try {
                //bkCuentaBancaria.setListaCuentaBancariasActivas(servicioCuentaBancaria.listarCuentaBancariasPorFiltro(bkCuentaBancaria.getCuentaBancariaBusqueda()));
                bkCuentaBancaria.setListaCuentaBancariaLista(cuentaBancariaModel.obtenerListaCuentaBancaria(bkCuentaBancaria.getCuentaBancariaBusqueda()));
            } catch (ModelExcepcion ex) {
                System.out.println(ex.getMensaje());
            }
            mostrarMensaje("Se eliminó la cuenta bancaria satisfactoriamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la información. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String aceptar() {
        try {
            servicioCuentaBancaria.actualizarCuentaBancaria(bkCuentaBancaria.getCuentaBancariaFormulario());
            bkCuentaBancaria.setCuentaBancariaFormulario(servicioCuentaBancaria.conseguirCuentaBancariaPorId(1));
            bkCuentaBancaria.setListaCuentaBancariasActivas(servicioCuentaBancaria.listarCuentaBancariasActivas());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.CuentaBancaria.URL_LISTA_CUENTA_BANCARIA;
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {

        return URLPaginacion.CuentaBancaria.URL_LISTA_CUENTA_BANCARIA;
        //return mostrarMantenimiento();
    }

    /**
     * Limpia la pantalla de consulta cuenta bancaria e inicializa la
     * informacion del backing bean.
     *
     * @return void.
     */
    private void limpiarBusqueda() {
        //bkCuentaBancaria.setListaCuentaBancariasActivas(null);
        bkCuentaBancaria.setListaCuentaBancariaLista(null);
        /*bkCuentaBancaria.setIdTipoMonedaBusqueda(0);
        bkCuentaBancaria.setIdBancoBusqueda(0);*/
        bkCuentaBancaria.setCuentaBancariaBusqueda(new CuentaBancaria());

        bkCuentaBancaria.getCuentaBancariaBusqueda().setIdTipoMoneda(new TipoMoneda(0));
        bkCuentaBancaria.getCuentaBancariaBusqueda().setIdBanco(new Banco(0));
        bkCuentaBancaria.getCuentaBancariaBusqueda().setNumeroCuenta("");
        
    }

    /**
     * Carga los componentes selectOneMenu(Bancos, Tipo Moneda) del formulario
     * consulta Cuenta Bancaria
     *
     * @return void.
     */
    private void cargarCombo() {
        try {
//            bkCuentaBancaria.setListaEmpresas(SelectOneMenuHelper.listaEmpresasConsulta((List<Empresa>) servicioEmpresa.listarEmpresasActivas()));
//            bkCuentaBancaria.setListaTipoCtaBancaria(servicioParametro.listarTipoCuentaBancariaActivas());

            bkCuentaBancaria.setListaBanco(SelectOneMenuHelper.listaBancosConsulta2((List<Banco>) servicioBanco.listarBancosActivos()));

            //bkCuentaBancaria.setMostrarListaBanco(servicioBanco.listarBancosActivos());

            bkCuentaBancaria.setListaTipoMoneda(SelectOneMenuHelper.listaTipoMonedaConsulta2((List<TipoMoneda>) servicioTipoMoneda.listarTipoMonedasActivos()));

            //bkCuentaBancaria.setMostrarListaMoneda(servicioTipoMoneda.listarTipoMonedasActivos());

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    private void cargarComboActualizar() {
        try {

            bkCuentaBancaria.setListaBanco(SelectOneMenuHelper.listaBancosConsulta2((List<Banco>) servicioBanco.listarBancosActivos()));
            bkCuentaBancaria.setListaTipoMoneda(SelectOneMenuHelper.listaTipoMonedaConsulta2((List<TipoMoneda>) servicioTipoMoneda.listarTipoMonedasActivos()));

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }
}
